/**
 * Universidad del Valle de Guatemala
 * Programacion Orientada a Objetos
 * Archivo: PersistenciaSQL.java
 * Proyecto 02: Cartera Virtual
 */

package BaseDatos;

import java.sql.*;
import java.util.Hashtable;

 /**
 * @author Grupo 09
 * Descripcion:...
 */
public class PersistenciaSQL {
    
    private String message;
    private String user;
    private String password;
    private String db;
    private String host;
    private String url;
    public Connection connection = null;
    private Statement statement;
    private ResultSet resultSet;
    
    
    //--------------------------------------------------------------------------
    // Constructores
    //--------------------------------------------------------------------------

    /**
     * Constructor que inicializa llas instrucciones de url para la coneccion
     * a la Base de datos MySQL
     */
    public PersistenciaSQL() {
        url = "jdbc:mysql://" + host+"/" + db;
    }

    /**
     * Constructor que inicializa los datos necesarios para la coneccion a la 
     * base de datos de MySQL.
     * @param serverX : servidor de hosting.
     * @param userX : usuario para la administracion de la base de datos.
     * @param passwordX : contrasena para acceder a la ase de datos.
     * @param dbX : el nombre de la base de datos.
     */
    public PersistenciaSQL(String serverX, String userX, String passwordX, String dbX) {
        user = userX;
        password = passwordX;
        db = dbX;
        host = serverX;
        url = "jdbc:mysql://" + host + "/" + db;
    }

    
    //--------------------------------------------------------------------------
    // Metodos
    //--------------------------------------------------------------------------
    
    /**
     * Metodo que realiza la coneccion a la base de datos.
     */
    public void connect() {
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            connection = DriverManager.getConnection(url, user, password);
            if (connection != null) {
                message  = "Conexión a base de datos " + url + " correcta";
                statement = connection.createStatement();
            }
        }
        catch(SQLException ex) {
            message = "No se pudo conectar con la base de datos " + url;
        }
        catch(ClassNotFoundException ex) {
            message = ""+ ex;
        }
    }

    /**
     * Metodo para obtener el nombre de la base de datos.
     * @return 
     */
    public String getDb() {
        return db;
    }

    /**
     * Metodo para modificar el nombre de la base de datos.
     * @param dbX : el nombre de la nueva base de datos.
     */
    public void setDb(String dbX) {
        db = dbX;
    }

    /**
     * Metodo para obtener el host.
     * @return 
     */
    public String getHost() {
        return host;
    }

    /**
     * Metodo para modificar el Host.
     * @param hostX : nuevo host de la base de datos.
     */
    public void setHost(String hostX) {
        host = hostX;
    }

    /**
     * Metodo para obtener la contrasena de acceso a la base de datos
     * @return 
     */
    public String getPassword() {
        return password;
    }

    /**
     * Metodo para modificar la contrasena de acceso a la base de datos
     * @param passwordX : la nueva contrasena.
     */
    public void setPassword(String passwordX) {
    password = passwordX;
    }

    /**
     * Metodo para obtener el nombre de usuario para la administracion de la base 
     * de datos
     * @return 
     */
    public String getUser() {
        return user;
    }

    /**
     * Metodo para modificar el nombre de usuario de la base de datos.
     * @param userX 
     */
    public void setUser(String userX) {
        user = userX;
    }

    public String getMessage(){
        return message;
    }
    /**
     * Metodo para realizar consultas
     * @param tableX : nombre de la tabla.
     * @return : el resultado de la consulta.
     * @throws SQLException : 
     */
    public ResultSet consult(String tableX) throws SQLException {
        resultSet = statement.executeQuery("SELECT * FROM " + tableX);
        return resultSet;
    }

    /**
     * Metodo para realizar busquedas por nombre dentro de la base de datos.
     * @param tableX : nomber de la tabla
     * @param nameX : nombre del dato a buscar.
     * @return 
     * @throws SQLException 
     */
    public String searchName(String tableX, String nameX) throws SQLException {
        String name = null;
        try{
            resultSet = statement.executeQuery("SELECT * FROM " + tableX +
                    " WHERE nombre = ‘" + nameX +"‘ LIMIT 1");
            resultSet.next();
            name = resultSet.getString(2);
            }
        catch(SQLException ex){
            message = ex.toString();
        }
        return name;
    }

    /**
     * Metodo para insertar datos dentro de las tablas.
     * @param userX : nombre de usuario para insertar datos.
     */
    public void insert(Hashtable userX) {
        try {
            statement.execute("INSERT INTO usuarios (nombre, contraseña) VALUES (‘"
                    + userX.get("nombre") + "‘,’" + userX.get("contraseña") + "‘)");
        } 
        catch (SQLException ex) {
            message = ex.toString();
        }
    }

    /**
     * Metodo para actualizar los datos.
     * @param tableX : nombre de la tabla
     * @param userX : nombre de usuario
     * @param nameX : nombre(dato a modificar).
     */
    public void update(String tableX, Hashtable userX, String nameX) {
        try {
            statement.execute("UPDATE " + tableX + " SET nombre=’" + userX.get("nombre")
                    + "‘ WHERE nombre=’" + nameX + "‘");
        }
        catch (SQLException ex) {
            message = ex.toString();
        }
    }

    /**
     * Metodo para eliminar un dato.
     * @param tabla : nombre de la tabla
     * @param nombre : nombre del dato.
     */
    public void delete(String tableX, String nameX) {
        try {
            statement.execute("DELETE FROM " + tableX +  "WHERE nombre=’" + nameX + "‘");
        }
        catch (SQLException ex) {
            message = ex.toString();
        }
    }
}